﻿using System;
using System.Collections.Generic;

using System.Text;

using TerminologiaSinacor.Presenter;
using TerminologiaSinacor.Presenter.Utility;

using System.Data.OracleClient;
using System.Data;
using System.Configuration;

namespace TerminologiaSinacor.Presenter.DAL.Oracle
{
    public class GlossarioDAO
    {

        public static List<Glossario> searchKey(String chave)
        {
            List<Glossario> glossarios = new List<Glossario>();

            /*
             * Regra de negócio defendída por Fernando Ammon Valle na apresentação de 16/07/2008.
             * 7- A pesquisa de termos do glossario por palavra-chave deve incidir sobre os termos preteridos além do termo preferido.
                No Access, o resultado da pesquisa mostra o termo (preferido ou preterido), as abreviaturas e se o termo é preferido (S/N) e se 
                o termo é recomendado (S/N). O termo nao sera recomendado se o indicador sinonimo estiver marcado.
             * 
             */

            string sql = @"
 
 select
                     COD_TERMO_GLOSSARIO
                    ,TermoGlossario
                    ,NOME_ABREVIATURA_1
                    ,NOME_ABREVIATURA_2
                    ,IND_SINONIMO
                    ,(case when (IND_SINONIMO = 1) then 'Sim' else ' Não' end) IND_SINONIMOLabel
                    ,preferido
from
(
                    select 

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_GLOSSARIO TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,'Sim' preferido
            
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1
                     ";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_GLOSSARIO", chave);

            sql += @" union all
                     
                     select 


                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_1 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,'Não' preferido
              
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

                    sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_1", chave);

                     sql += @"union all
                     
                     select 

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_2 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                     ,'Não' preferido
              
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

                     sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_2", chave);

            sql += @" union all
                     
                     select 

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_3 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,'Não' preferido
                    
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_3", chave);

            sql += @"  union all
                     
                    select

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_4 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,'Não' preferido
                    
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_4", chave);

            sql += @" union all
                    
                    select 

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_5 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,'Não' preferido
                    
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_5", chave);

            sql += @" union all

                select
                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_6 TermoGlossario
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    , 'Não' preferido
                    
                     from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_6", chave);

            sql += @"                     
                    ) QueryBody

                    order by TermoGlossario ";

            using (IDataReader rdr = TerminologiaSinacor.Presenter.DAL.Oracle.OracleHelper.executeReader(ConfigurationManager.AppSettings["ConnectionStringSinaTools"], System.Data.CommandType.Text, sql, null))
            {
                while (rdr.Read())
                {
                    Glossario myGlossario = new Glossario();
 
                    myGlossario.Id = rdr["COD_TERMO_GLOSSARIO"].ToString();
                    myGlossario.NomeTermo = rdr["TermoGlossario"].ToString();
                    myGlossario.Abreviatura1 = rdr["NOME_ABREVIATURA_1"].ToString();
                    myGlossario.Abreviatura2 = rdr["NOME_ABREVIATURA_2"].ToString();
                    myGlossario.Sinonimo = rdr["IND_SINONIMO"].ToString() == "1";
                    myGlossario.SinonimoLabel = rdr["IND_SINONIMO"].ToString() == "1" ? "Sim" : "Não";
                    myGlossario.Preferido =  rdr["preferido"].ToString();
 
                    /*
                     Regra de negócio defendida por Fernando Ammon Valle na apresentação de 16/07/2008
                     *  7- A pesquisa de termos do glossario por palavra-chave deve incidir sobre os termos preteridos além do termo preferido.
                        No Access, o resultado da pesquisa mostra o termo (preferido ou preterido), as abreviaturas e se o termo é preferido (S/N) e se 
                        o termo é recomendado (S/N). O termo nao sera recomendado se o indicador sinonimo estiver marcado.
                     */
                    myGlossario.TermoEhRecomendado = myGlossario.Sinonimo == true ? "Não" : "Sim";

                    glossarios.Add(myGlossario);
                }
            }
            return glossarios;
        }
                    
        public static List<Glossario> search(Glossario filtroGlossario)
        {

            List<Glossario> glossarios = new List<Glossario>();

            string sql = "";

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO", filtroGlossario.Id);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_FISICO", filtroGlossario.NomeFisico);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_1", filtroGlossario.NomePreterido1);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_2", filtroGlossario.NomePreterido2);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_3", filtroGlossario.NomePreterido3);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_4", filtroGlossario.NomePreterido4);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_5", filtroGlossario.NomePreterido5);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_6", filtroGlossario.NomePreterido6);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_TERMO_GLOSSARIO", filtroGlossario.NomeTermo);

            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1", filtroGlossario.Abreviatura1);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2", filtroGlossario.Abreviatura2);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.TXT_COMENTARIO", filtroGlossario.Comentario);
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.DESC_TERMO_GLOSSARIO", filtroGlossario.Descricao);

            sql = Util.convertToSqlSearch(sql, "to_char(TS2_TERMO_GLOSSARIO.DATA_DOCUMENTACAO,'dd/mm/yyyy')", filtroGlossario.DocumentacaoData);
            
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.RESP_DOCUMENTACAO.NOME_RESPONSAVEL", filtroGlossario.DocumentacaoResponsavel);
            
            sql = Util.convertToSqlSearch(sql, "TS2_TERMO_GLOSSARIO.IND_SINONIMO", filtroGlossario.Sinonimo == true ? "1" : "");

            sql = Util.convertToSqlSearch(sql, "RECOMENDADO.NOME_TERMO_GLOSSARIO", filtroGlossario.TermoRecomendado);
            sql = Util.convertToSqlSearch(sql, "to_char(TS2_TERMO_GLOSSARIO.DATA_VALIDACAO,'dd/mm/yyyy')", filtroGlossario.ValidacaoData);

            sql = Util.convertToSqlSearch(sql, "RESP_VALIDACAO.NOME_RESPONSAVEL", filtroGlossario.ValidacaoResponsavel);

            sql = @"select 

                     TS2_TERMO_GLOSSARIO.COD_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_1
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_2
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_3
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_4
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_5
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_PRETERIDO_6
                    ,TS2_TERMO_GLOSSARIO.DESC_TERMO_GLOSSARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_1
                    ,TS2_TERMO_GLOSSARIO.NOME_ABREVIATURA_2
                    ,TS2_TERMO_GLOSSARIO.NOME_FISICO
                    ,TS2_TERMO_GLOSSARIO.IND_SINONIMO
                    ,TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO
                    ,to_char(TS2_TERMO_GLOSSARIO.DATA_DOCUMENTACAO,'dd/mm/yyyy') DATA_DOCUMENTACAO
                    ,TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO                   
                    ,to_char(TS2_TERMO_GLOSSARIO.DATA_VALIDACAO,'dd/mm/yyyy') DATA_VALIDACAO
                    ,TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO
                    ,TS2_TERMO_GLOSSARIO.TXT_COMENTARIO
                    ,TS2_TERMO_GLOSSARIO.NOME_TERMO_SERVICO 
                    ,RESP_DOCUMENTACAO.COD_RESPONSAVEL 
                    ,RESP_DOCUMENTACAO.NOME_RESPONSAVEL NOME_RESPONSAVEL_DOCUMENTACAO
                    ,RESP_DOCUMENTACAO.TXT_CONTATO_RESPONSAVEL
                    ,RESP_VALIDACAO.COD_RESPONSAVEL
                    ,RESP_VALIDACAO.NOME_RESPONSAVEL NOME_RESPONSAVEL_VALIDACAO
                    ,RESP_VALIDACAO.TXT_CONTATO_RESPONSAVEL
                    
                    ,RECOMENDADO.COD_TERMO_GLOSSARIO COD_TERMO_RECOMENDADO
                    ,RECOMENDADO.NOME_TERMO_GLOSSARIO NOME_TERMO_RECOMENDADO
              
                    from        TS2_TERMO_GLOSSARIO
                     left join TS_RESPONSAVEL RESP_DOCUMENTACAO  on TS2_TERMO_GLOSSARIO.COD_RESP_DOCUMENTACAO = RESP_DOCUMENTACAO.COD_RESPONSAVEL
                     left join TS_RESPONSAVEL RESP_VALIDACAO   on TS2_TERMO_GLOSSARIO.COD_RESP_VALIDACAO = RESP_VALIDACAO.COD_RESPONSAVEL
                     left join TS2_TERMO_GLOSSARIO RECOMENDADO ON TS2_TERMO_GLOSSARIO.COD_TERMO_RECOMENDADO = RECOMENDADO.COD_TERMO_GLOSSARIO
                     where 1 = 1
                    " + sql + " order by NOME_TERMO_GLOSSARIO ";

            using (IDataReader rdr = TerminologiaSinacor.Presenter.DAL.Oracle.OracleHelper.executeReader(ConfigurationManager.AppSettings["ConnectionStringSinaTools"], System.Data.CommandType.Text, sql, null))
              {
                while (rdr.Read())
                {
                    Glossario myGlossario = new Glossario();

                    myGlossario.Id = rdr["COD_TERMO_GLOSSARIO"].ToString();
                    myGlossario.NomeTermo = rdr["NOME_TERMO_GLOSSARIO"].ToString();
                    myGlossario.NomePreterido1 = rdr["NOME_TERMO_PRETERIDO_1"].ToString();
                    myGlossario.NomePreterido2 = rdr["NOME_TERMO_PRETERIDO_2"].ToString();
                    myGlossario.NomePreterido3 = rdr["NOME_TERMO_PRETERIDO_3"].ToString();
                    myGlossario.NomePreterido4 = rdr["NOME_TERMO_PRETERIDO_4"].ToString();
                    myGlossario.NomePreterido5 = rdr["NOME_TERMO_PRETERIDO_5"].ToString();
                    myGlossario.NomePreterido6 = rdr["NOME_TERMO_PRETERIDO_6"].ToString();
                    myGlossario.Descricao = rdr["DESC_TERMO_GLOSSARIO"].ToString();
                    myGlossario.Abreviatura1 = rdr["NOME_ABREVIATURA_1"].ToString();
                    myGlossario.Abreviatura2 = rdr["NOME_ABREVIATURA_2"].ToString();                   
                    myGlossario.Sinonimo = rdr["IND_SINONIMO"].ToString() == "1" ;
                    myGlossario.SinonimoLabel = rdr["IND_SINONIMO"].ToString() == "1" ? "Sim" : "Não";
                    myGlossario.DocumentacaoData = rdr["DATA_DOCUMENTACAO"].ToString();
                    myGlossario.DocumentacaoResponsavel = rdr["NOME_RESPONSAVEL_DOCUMENTACAO"].ToString();
                    myGlossario.ValidacaoData = rdr["DATA_VALIDACAO"].ToString();
                    myGlossario.ValidacaoResponsavel = rdr["NOME_RESPONSAVEL_VALIDACAO"].ToString();
                    myGlossario.TermoRecomendado = rdr["NOME_TERMO_RECOMENDADO"].ToString();
                    myGlossario.NomeFisico = rdr["NOME_FISICO"].ToString();
                    myGlossario.Comentario = rdr["TXT_COMENTARIO"].ToString();

                    /*
                     Regra de negócio defendida por Fernando Ammon Valle na apresentação de 16/07/2008
                     *  7- A pesquisa de termos do glossario por palavra-chave deve incidir sobre os termos preteridos além do termo preferido.
                        No Access, o resultado da pesquisa mostra o termo (preferido ou preterido), as abreviaturas e se o termo é preferido (S/N) e se 
                        o termo é recomendado (S/N). O termo nao sera recomendado se o indicador sinonimo estiver marcado.
                     */
                    myGlossario.TermoEhRecomendado = myGlossario.Sinonimo == true ? "Não" : "Sim";

                    glossarios.Add(myGlossario);
                }
            }

            return glossarios;

        }
    }
}
